package com.example.chapter06;

import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

/**
 * AppWriteActivity 类演示了如何将数据写入 Application 的全局缓存中。
 * 它实现 View.OnClickListener 接口，以便统一处理点击事件。
 */
public class AppWriteActivity extends AppCompatActivity implements View.OnClickListener {

    // 声明界面上的控件变量
    private EditText et_name;     // 姓名输入框
    private EditText et_age;      // 年龄输入框
    private EditText et_height;   // 身高输入框
    private EditText et_weight;   // 体重输入框
    private CheckBox ck_married;  // 已婚复选框

    // 声明一个 MyApplication 实例的引用
    // 这将是我们的“全局数据缓存”的入口
    private MyApplication app;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 加载布局文件
        setContentView(R.layout.activity_app_write);

        // --- 控件初始化 ---
        et_name = findViewById(R.id.et_name);
        et_age = findViewById(R.id.et_age);
        et_height = findViewById(R.id.et_height);
        et_weight = findViewById(R.id.et_weight);
        ck_married = findViewById(R.id.ck_married);

        // --- 事件监听绑定 ---
        // 找到“保存”按钮，并设置点击监听器为 this (即本 Activity)
        // 当按钮被点击时，下面的 onClick(View v) 方法将被触发
        findViewById(R.id.btn_save).setOnClickListener(this);

        // --- 核心：获取 Application 实例 ---
        // 通过 MyApplication 提供的 getInstance() 静态方法，
        // 获取到那个在 APP 启动时就被创建的、全局唯一的 Application 实例。
        app = MyApplication.getInstance();

        // --- 数据回显 ---
        // 尝试从全局缓存中加载已保存的数据，并显示到界面上
        reload();
    }

    /**
     * reload 方法负责“数据回显”。
     * 它会检查 Application 的 infoMap 中是否已有数据，
     * 如果有，就将这些数据显示在对应的输入框中。
     */
    private void reload() {
        // 1. 从全局的 infoMap 中尝试获取 "name"
        String name = app.infoMap.get("name");

        // 如果 name 是 null（即第一次打开，还没存过数据），就直接返回，不执行后续操作
        if (name == null) {
            return;
        }

        // 2. 如果 name 不是 null，说明存过数据，继续获取其他数据
        String age = app.infoMap.get("age");
        String height = app.infoMap.get("height");
        String weight = app.infoMap.get("weight");
        String married = app.infoMap.get("married");

        // 3. 将从缓存中读取到的数据显示到界面上
        et_name.setText(name);
        et_age.setText(age);
        et_height.setText(height);
        et_weight.setText(weight);

        // 4. 处理 CheckBox 的状态
        if ("是".equals(married)) {
            ck_married.setChecked(true);
        } else {
            ck_married.setChecked(false);
        }
    }

    /**
     * 当界面上的控件被点击时，此方法会被调用。
     * 在这个例子中，只有 "btn_save" 按钮绑定了监听。
     * @param v 被点击的 View 控件（这里就是 "btn_save" 按钮）
     */
    @Override
    public void onClick(View v) {
        // 1. 从各个输入框（EditText）获取用户输入的最新文本
        String name = et_name.getText().toString();
        String age = et_age.getText().toString();
        String height = et_height.getText().toString();
        String weight = et_weight.getText().toString();

        // 2. (核心) 将这些最新的数据存入 Application 的全局 infoMap 中
        //    使用的是 Map 的 put 方法 (Key-Value 形式)
        app.infoMap.put("name", name);
        app.infoMap.put("age", age);
        app.infoMap.put("height", height);
        app.infoMap.put("weight", weight);

        // 3. (核心) 处理 CheckBox 的值，使用三元运算符
        //    如果 ck_married 被选中 (isChecked() 为 true)，就存入 "是"
        //    否则，存入 "否"
        app.infoMap.put("married", ck_married.isChecked() ? "是" : "否");

        // 注意：数据到这里就“保存”完了（保存在内存里了）
        // 可以在这里加一个 Toast 提示用户“保存成功”
        // Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
    }
}
